﻿//Dùng tại: + frmDoanhThu
//          + rptMauHH01x
//          + rptMauHH02x
//          + rptMauHH03x
//          + frmChuyenDL

using System;
using System.Data;
using System.Data.SqlClient;

namespace prjKQXS_DLL.Doanh_thu
{
    public class clsDoanhThu
    {
        //Cài đặt event OnError để bắt các lỗi chưa được xử lý
        public delegate void OnErrorHandler(Exception e);
        public event OnErrorHandler OnError;

        //Cài đặt event OnAction để thông báo các trạng thái kết quả
        public delegate void OnActionHandler(SqlException e);
        public event OnActionHandler OnAction;

        #region Methods ==============================================================
        public static void fill_TongDT_HoaHong_TyLe(object isBanRong, decimal doanhthu, decimal TruyenThong, decimal Boc, decimal LoTo, ref decimal TongDT, ref decimal hoahong, ref decimal TyLe, string caller="")
        {
            TongDT = TruyenThong + Boc + LoTo;
            if (caller != "rptMauHH01x" && caller != "rptMauHH02x" && caller != "rptMauHH03x") hoahong = clsDoanhThu.HoaHong(isBanRong, TruyenThong, LoTo, Boc);
            if (doanhthu == 0) doanhthu = 1;
            TyLe = Math.Round(TongDT / doanhthu * 100, 2);
        }


        /// <summary>
        /// Lấy dữ liệu để làm nguồn cho frmDoanhThu trong trường hợp thêm mới
        /// </summary>
        /// <param name="MaDV">Mã đơn vị: Nếu lấy tất cả thì truyền vào '%', ngược lại thì truyền vào mã đơn vị tương ứng</param>
        /// <param name="DMCanBoID">DMCanBo.DMCanBoID: Nếu lấy tất cả thì để -1, ngược lại thì truyền vào id tương ứng</param>
        /// <param name="Ngay">Từ ngày</param>
        /// <param name="isPublic"></param>
        /// <param name="isDaiLyThiTran">Dùng để lọc ra đại lý thị trấn (nếu là true).</param>
        /// <param name="isKhongDuDoanhThu">Dùng để lọc ra đại lý thị trấn không đủ doanh thu(nếu là true).</param>
        /// <returns></returns>
        private DataTable loadData_ForAddition
            (char MaDV
            , int DMCanBoID
            , DateTime Ngay
            , bool isPublic
            , bool isDaiLyThiTran = false
            , bool isKhongDuDoanhThu = false)
        {
            DataTable dt = new DataTable("rptHoaHong");

            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                SqlDataAdapter da = new SqlDataAdapter("proc_DT_loadData_ForAddition", conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.CommandTimeout = 1*60*60;
                da.SelectCommand.Parameters.AddWithValue("@Ngay", Ngay.Date);
                da.SelectCommand.Parameters.AddWithValue("@MaDV", MaDV);
                da.SelectCommand.Parameters.AddWithValue("@DMCanBoID", DMCanBoID);
                da.SelectCommand.Parameters.AddWithValue("@isPublic", isPublic ? 1 : 0);
                da.SelectCommand.Parameters.AddWithValue("@isDaiLyThiTran", isDaiLyThiTran ? 1 : 0);

                da.Fill(dt);
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }


        /// <summary>
        /// Lấy dữ liệu để làm nguồn cho frmDoanhThu trong trường hợp sửa xóa
        /// </summary>
        /// <param name="MaDV">Mã đơn vị: Nếu lấy tất cả thì truyền vào '%', ngược lại thì truyền vào mã đơn vị tương ứng</param>
        /// <param name="DMCanBoID">DMCanBo.DMCanBoID: Nếu lấy tất cả thì để -1, ngược lại thì truyền vào id tương ứng</param>
        /// <param name="Ngay">Từ ngày</param>
        /// <param name="isPublic"></param>
        /// <param name="isDaiLyThiTran">Dùng để lọc ra đại lý thị trấn (nếu là true).</param>
        /// <param name="isKhongDuDoanhThu">Dùng để lọc ra đại lý thị trấn không đủ doanh thu(nếu là true).</param>
        /// <returns></returns>
        private DataTable loadData_ForEdition
            (char MaDV
            , int DMCanBoID
            , DateTime Ngay
            , bool isPublic = true
            , bool isDaiLyThiTran = false
            , bool isKhongDuDoanhThu = false)
        {
            DataTable dt = new DataTable("rptHoaHong");

            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                SqlDataAdapter da = new SqlDataAdapter("proc_DT_loadData_ForEdition", conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.AddWithValue("@Ngay", Ngay.Date);
                da.SelectCommand.Parameters.AddWithValue("@MaDV", MaDV);
                da.SelectCommand.Parameters.AddWithValue("@DMCanBoID", DMCanBoID);
                da.SelectCommand.Parameters.AddWithValue("@isPublic", isPublic ? 1 : 0);
                da.SelectCommand.Parameters.AddWithValue("@isDaiLyThiTran", isDaiLyThiTran ? 1 : 0);

                da.Fill(dt);
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }


        /// <summary>
        /// Lấy dữ liệu để làm nguồn cho rptMauHH01y
        /// </summary>
        /// <param name="MaDV">Mã đơn vị: Nếu lấy tất cả thì truyền vào '%', ngược lại thì truyền vào mã đơn vị tương ứng</param>
        /// <param name="TuNgay">Từ ngày</param>
        /// <param name="DenNgay">Đến ngày</param>
        /// <param name="lblSumHT2">Dùng để lấy giá trị tổng cho cột %HT.</param>
        /// <param name="isDaiLyThiTran">Dùng để lọc ra đại lý thị trấn (nếu là true).</param>
        /// <returns></returns>
        public DataTable loadData_rptMauHH01y
            (char MaDV
            , DateTime TuNgay
            , DateTime DenNgay
            , ref string lblSumHT2
            , bool isDaiLyThiTran)
        {
            DataTable dt = new DataTable("rptHoaHong");

            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                SqlDataAdapter da = new SqlDataAdapter("proc_DT_rptMauHH01y", conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.CommandTimeout = 0;
                da.SelectCommand.Parameters.AddWithValue("@TuNgay", TuNgay);
                da.SelectCommand.Parameters.AddWithValue("@DenNgay", DenNgay);
                da.SelectCommand.Parameters.AddWithValue("@MaDV", MaDV);
                da.SelectCommand.Parameters.AddWithValue("@isDaiLyThiTran", isDaiLyThiTran ? 1 : 0);

                da.Fill(dt);

                decimal Tong_DoanhThu = 0, Tong_DTKH = 0;
                xuly(ref dt, ref lblSumHT2, ref Tong_DTKH, ref Tong_DoanhThu, "rptMauHH01x");

                if (lblSumHT2 != null && Tong_DTKH != 0)
                {
                    decimal slblSumHT2 = (Tong_DoanhThu / Tong_DTKH) * 100;
                    lblSumHT2 = Math.Round(slblSumHT2, 2).ToString("#,##0.00");
                }
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }


        /// <summary>
        /// Dùng tại frmDoanhThu.loadData(), loadData_rptMauHH01x()
        /// </summary>
        /// <param name="MaDV">Mã đơn vị: Nếu lấy tất cả thì truyền vào '%', ngược lại thì truyền vào mã đơn vị tương ứng</param>
        /// <param name="DMCanBoID">DMCanBo.DMCanBoID: Nếu lấy tất cả thì để -1, ngược lại thì truyền vào id tương ứng</param>
        /// <param name="Ngay"></param>
        /// <param name="chkKhoiPhucChecked"></param>
        /// <param name="autoTruyenThong">Dùng để xác định xem cột Truyền thống có được load tự động không để điều khiển việc khóa cột truyền thống tại frmDoanhThu</param>
        /// <returns></returns>
        public DataTable loadData_frmDoanhThu(char MaDV, int DMCanBoID, DateTime Ngay
            , bool chkKhoiPhucChecked
            , ref bool autoTruyenThong)
        {
            DataTable dt = new DataTable("rptHoaHong");

            try
            {
                // kiem tra lai load doanh thu cho thang ko co du lieu đối với cán bộ
                SqlConnection conn = new SqlConnection(BienTc.connString);
               // conn.Open();
                if (conn.State != ConnectionState.Open) conn.Open();
                SqlCommand cmd = new SqlCommand("proc_DT_frmDoanhThu_loadData", conn);
                //SqlDataAdapter da = new SqlDataAdapter("proc_DT_frmDoanhThu_loadData", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                //da.SelectCommand.CommandType = CommandType.StoredProcedure;
                //da.SelectCommand.Parameters.AddWithValue("@Ngay", Ngay);
                //da.SelectCommand.Parameters.AddWithValue("@MaDV", MaDV);
                //da.SelectCommand.Parameters.AddWithValue("@DMCanBoID", DMCanBoID);
                cmd.Parameters.AddWithValue("@Ngay", Ngay);
                cmd.Parameters.AddWithValue("@MaDV", MaDV);
                cmd.Parameters.AddWithValue("@DMCanBoID", DMCanBoID);
                dt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection));
                //da.Fill(dt);

                int count = 0;
                try
                {
                    if (dt.Rows.Count > 0) count = Convert.ToInt32(dt.Rows[0]["TenDaiLy"]);
                }
                catch (Exception e)
                {
                    if (e.Message == "Input string was not in a correct format.") count = 0;
                    else throw;
                }

                if (count > 0)
                {
                    autoTruyenThong = true;
                    dt.Rows.RemoveAt(0);
                }
                else
                {

                    // Doan code load dai ly - chua chuyen dai ly
                    dt.Clear();
                    dt = loadData_ForAddition(MaDV, DMCanBoID, Ngay, !chkKhoiPhucChecked);
                    dt.Merge(loadData_ForEdition(MaDV, DMCanBoID, Ngay, !chkKhoiPhucChecked));

                    autoTruyenThong = false;
                }

                decimal Tong_DoanhThu = 0, Tong_DTKH = 0;
                string lblSumHT2 = ""; //Biến hình thức
                xuly(ref dt, ref lblSumHT2, ref Tong_DTKH, ref Tong_DoanhThu, "loadData_frmDoanhThu");
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }


        /// <summary>
        /// Dùng tại rptMauHH01x, frmTongHopDT.rptMauHH01x()
        /// </summary>
        /// <param name="MaDV">Mã đơn vị: Nếu lấy tất cả thì truyền vào '%', ngược lại thì truyền vào mã đơn vị tương ứng</param>
        /// <param name="DMCanBoID">DMCanBo.DMCanBoID: Nếu lấy tất cả thì để -1, ngược lại thì truyền vào id tương ứng</param>
        /// <param name="TuNgay"></param>
        /// <param name="DenNgay"></param>
        /// <param name="lblSumHT2">Dùng để lấy giá trị tổng cho cột %HT.</param>
        /// <param name="isDaiLyThiTran">Dùng để lọc ra đại lý thị trấn (nếu là true).</param>
        /// <returns></returns>
        public DataTable loadData_rptMauHH01x(char MaDV, int DMCanBoID, DateTime TuNgay, DateTime DenNgay, ref string lblSumHT2, bool isDaiLyThiTran)
        {
            DataTable dt = new DataTable("rptHoaHong");

            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                SqlDataAdapter da = new SqlDataAdapter("proc_DT_rptMauHH01x", conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.CommandTimeout = 0;
                da.SelectCommand.Parameters.AddWithValue("@TuNgay", TuNgay.Date);
                da.SelectCommand.Parameters.AddWithValue("@DenNgay", DenNgay.Date);
                da.SelectCommand.Parameters.AddWithValue("@MaDV", MaDV);
                da.SelectCommand.Parameters.AddWithValue("@DMCanBoID", DMCanBoID);
                da.SelectCommand.Parameters.AddWithValue("@isDaiLyThiTran", isDaiLyThiTran ? 1 : 0);

                da.Fill(dt);

                if (dt.Rows.Count == 0)
                {
                    bool Temp = true;
                    dt = loadData_frmDoanhThu(MaDV, DMCanBoID, TuNgay, false, ref Temp);
                }
                else
                {
                    decimal Tong_DoanhThu = 0, Tong_DTKH = 0;
                    xuly(ref dt, ref lblSumHT2, ref Tong_DTKH, ref Tong_DoanhThu, "rptMauHH01x");

                    if (lblSumHT2 != null && Tong_DTKH != 0)
                    {
                        decimal slblSumHT2 = (Tong_DoanhThu / Tong_DTKH) * 100;
                        lblSumHT2 = Math.Round(slblSumHT2, 2).ToString("#,##0.00");
                    }
                }
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }


        /// <summary>
        /// Dùng tại rptMauHH02x
        /// </summary>
        /// <param name="MaDV">Mã đơn vị: Nếu lấy tất cả thì truyền vào '%', ngược lại thì truyền vào mã đơn vị tương ứng</param>
        /// <param name="TuNgay"></param>
        /// <param name="DenNgay"></param>
        /// <param name="lblSumHT2">Dùng để lấy giá trị tổng cho cột %HT.</param>
        /// <returns></returns>
        public DataTable loadData_rptMauHH02x(char MaDV, DateTime TuNgay, DateTime DenNgay, ref string lblSumHT2)
        {
            DataTable dt = new DataTable("rptHoaHong");

            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                SqlDataAdapter da = new SqlDataAdapter("proc_DT_rptMauHH02x", conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.CommandTimeout = 0;
                da.SelectCommand.Parameters.AddWithValue("@TuNgay", TuNgay.Date);
                da.SelectCommand.Parameters.AddWithValue("@DenNgay", DenNgay.Date);
                da.SelectCommand.Parameters.AddWithValue("@MaDV", MaDV);
                da.Fill(dt);

                decimal Tong_DoanhThu = 0, Tong_DTKH = 0;
                //xuly(ref dt, ref lblSumHT2, ref Tong_DTKH, ref Tong_DoanhThu, lblSumHT2);
                xuly(ref dt, ref lblSumHT2, ref Tong_DTKH, ref Tong_DoanhThu, "rptMauHH02x");

                if (lblSumHT2 != null && Tong_DTKH != 0)
                {
                    decimal slblSumHT2 = (Tong_DoanhThu / Tong_DTKH) * 100;
                    lblSumHT2 = Math.Round(slblSumHT2, 2).ToString("#,##0.00");
                }
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }


        /// <summary>
        /// Dùng tại rptMauHH03x
        /// </summary>
        /// <param name="TuNgay"></param>
        /// <param name="DenNgay"></param>
        /// <param name="lblSumHT2">Dùng để lấy giá trị tổng cho cột %HT.</param>
        /// <returns></returns>
        public DataTable loadData_rptMauHH03x(DateTime TuNgay, DateTime DenNgay, ref string lblSumHT2)
        {
            DataTable dt = new DataTable("rptHoaHong");

            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                SqlDataAdapter da = new SqlDataAdapter("proc_DT_rptMauHH03x", conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.CommandTimeout = 0;
                da.SelectCommand.Parameters.AddWithValue("@TuNgay", TuNgay.Date);
                da.SelectCommand.Parameters.AddWithValue("@DenNgay", DenNgay.Date);
                da.SelectCommand.CommandTimeout = 0;
                da.Fill(dt);

                decimal Tong_DoanhThu = 0, Tong_DTKH = 0;
                xuly(ref dt, ref lblSumHT2, ref Tong_DTKH, ref Tong_DoanhThu, "rptMauHH03x");

                if (lblSumHT2 != null && Tong_DTKH != 0)
                {
                    decimal slblSumHT2 = (Tong_DoanhThu / Tong_DTKH) * 100;
                    lblSumHT2 = Math.Round(slblSumHT2, 2).ToString("#,##0.00");
                }
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }


        private void xuly(ref DataTable dt, ref string lblSumHT2, ref decimal Tong_DTKH, ref decimal Tong_DoanhThu, string caller = "")
        {
            dt.Columns.Add("TongDT", typeof(int));
            dt.Columns.Add("TyLe", typeof(decimal));
            dt.Columns.Add("LoTo", typeof(int));

            if (caller != "rptMauHH01x" && caller != "rptMauHH02x" && caller != "rptMauHH03x")
                dt.Columns.Add("HoaHong", typeof(decimal));

            //Nếu (caller == "loadData_frmDoanhThu" || caller == "frmTongHopDT") thì không cần đến các cột:
            //HH_TruyenThong, HH_Boc, HH_LoTo234, HH_CapSo
            if (caller == "loadData_frmDoanhThu" || caller == "frmTongHopDT")
            {
                decimal Boc, LoTo, TruyenThong, TongDT = 0;
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    TruyenThong = clsCommon.getDecimal(dt.Rows[i]["TThong"]);
                    Boc = clsCommon.getDecimal(dt.Rows[i]["Boc"]);
                    LoTo = clsCommon.getDecimal(dt.Rows[i]["LoTo234"]) + clsCommon.getDecimal(dt.Rows[i]["CapSo"]);
                    dt.Rows[i]["LoTo"] = LoTo;

                    bool br = false;
                    string banrong = dt.Rows[i]["isBanRong"].ToString().Trim();
                    if (banrong != "" && banrong.ToUpper() != "FALSE")
                        br = banrong == "True" || System.Convert.ToInt32(banrong) >= 1;

                    decimal hoahong = 0, tyLe = 0;
                    decimal doanhthu = clsCommon.getDecimal(dt.Rows[i]["DoanhThu"]);
                    Tong_DTKH += doanhthu;
                    fill_TongDT_HoaHong_TyLe(br, doanhthu, TruyenThong, Boc, LoTo, ref TongDT, ref hoahong, ref tyLe, caller);
                    Tong_DoanhThu += TongDT;
                    if (TongDT != 0) dt.Rows[i]["TongDT"] = TongDT;
                    if (hoahong != 0) dt.Rows[i]["HoaHong"] = hoahong;
                    if (tyLe != 0) dt.Rows[i]["TyLe"] = tyLe;
                }

                if (lblSumHT2 != null && Tong_DTKH != 0)
                {
                    decimal slblSumHT2 = (Tong_DoanhThu / Tong_DTKH) * 100;
                    lblSumHT2 = Math.Round(slblSumHT2, 2).ToString("#,##0.00");
                }
            }
            else //if (caller != "loadData_frmDoanhThu" && caller != "frmTongHopDT")
            {
                dt.Columns.Add("HH_TruyenThong", typeof(decimal));
                dt.Columns.Add("HH_Boc", typeof(decimal));
                dt.Columns.Add("HH_LoTo234", typeof(decimal));
                dt.Columns.Add("HH_CapSo", typeof(decimal));
                decimal Boc, LoTo234, CapSo, TruyenThong, TongDT = 0;
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    TruyenThong = clsCommon.getDecimal(dt.Rows[i]["TThong"]);
                    Boc = clsCommon.getDecimal(dt.Rows[i]["Boc"]);
                    LoTo234 = clsCommon.getDecimal(dt.Rows[i]["LoTo234"]);
                    CapSo = clsCommon.getDecimal(dt.Rows[i]["CapSo"]);
                    dt.Rows[i]["LoTo"] = LoTo234 + CapSo;

                    bool br = false;
                    //string banrong = (caller != "rptMauHH01x" && caller != "rptMauHH02x" && caller != "rptMauHH03x") ? dt.Rows[i]["isBanRong"].ToString().Trim() : "";
                    //string banrong = (caller != "rptMauHH01x" && caller != "rptMauHH03x") ? dt.Rows[i]["isBanRong"].ToString().Trim() : "";
                    string banrong = (caller != "rptMauHH01x") ? dt.Rows[i]["isBanRong"].ToString().Trim() : "";
                    if (banrong != "" && banrong.ToUpper() != "FALSE")
                        br = banrong == "True" || System.Convert.ToInt32(banrong) >= 1;

                    decimal hoaHong = 0;
                    if (br)
                    {
                        decimal TyLe = 0;

                        if (TruyenThong < 10000) TyLe = 2;
                        else if (TruyenThong >= 10000 && TruyenThong <= 15000) TyLe = 2.5M;
                        else if (TruyenThong > 15000 && TruyenThong <= 25000) TyLe = 3;
                        else if (TruyenThong > 25000 && TruyenThong <= 30000) TyLe = 3.5M;
                        else if (TruyenThong > 30000) TyLe = 4;

                        hoaHong = (TruyenThong / 100) * TyLe;
                    }

                    dt.Rows[i]["HH_TruyenThong"] = (TruyenThong / 100) * 10 + hoaHong;
                    dt.Rows[i]["HH_LoTo234"] = (LoTo234 / 100) * 7;
                    if (CapSo != 0) dt.Rows[i]["HH_CapSo"] = (CapSo / 100) * 7;
                    decimal boc2 = br ? (Boc / 100) * 2 : 0;
                    decimal boc10 = (Boc / 100) * 10;
                    dt.Rows[i]["HH_Boc"] = boc10 + boc2;
                    decimal hoahong = 0, tyLe = 0;
                    decimal doanhthu = clsCommon.getDecimal(dt.Rows[i]["DoanhThu"]);
                    Tong_DTKH += doanhthu;
                    fill_TongDT_HoaHong_TyLe(br, doanhthu, TruyenThong, Boc, LoTo234 + CapSo, ref TongDT, ref hoahong, ref tyLe);
                    Tong_DoanhThu += TongDT;
                    if (TongDT != 0) dt.Rows[i]["TongDT"] = TongDT;

                    if (caller != "rptMauHH01x" && caller != "rptMauHH02x" && caller != "rptMauHH03x")
                        if (hoahong != 0) dt.Rows[i]["HoaHong"] = hoahong;

                    if (tyLe != 0) dt.Rows[i]["TyLe"] = tyLe;
                }

                if (lblSumHT2 != null && Tong_DTKH != 0)
                {
                    decimal slblSumHT2 = (Tong_DoanhThu / Tong_DTKH) * 100;
                    lblSumHT2 = Math.Round(slblSumHT2, 2).ToString("#,##0.00");
                }
            }
        }
        
        
        /// <summary>
        /// Hàm này thêm mới một dòng vào bảng DOANHTHU và trả về ID của dòng vừa thêm.
        /// </summary>
        /// <param name="dr"></param>
        /// <param name="Ngay"></param>
        /// <param name="allowInsertTruyenThong"></param>
        public object Insert(DataRow dr, DateTime Ngay, bool allowInsertTruyenThong, SqlConnection connection=null)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection conn;
                    if (connection == null) conn = new SqlConnection(BienTc.connString);
                    else conn = connection;
                    if (conn.State == ConnectionState.Closed) conn.Open();

                    SqlCommand cmd = new SqlCommand("proc_DT_frmDoanhThu_Insert", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@HopDongID", dr["HopDongID"]);
                    cmd.Parameters.AddWithValue("@Ngay", Ngay.Date);
                    cmd.Parameters.AddWithValue("@Doanh_Thu", 
                        string.IsNullOrEmpty(dr["DoanhThu"].ToString().Trim()) ? 0 : dr["DoanhThu"]);

                    cmd.Parameters.AddWithValue("@LoTo234", dr["LoTo234"]);
                    cmd.Parameters.AddWithValue("@CapSo", dr["CapSo"]);
                    cmd.Parameters.AddWithValue("@Boc", dr["Boc"]);

                    string br = dr["isBanRong"].ToString().Trim().ToUpper();
                    cmd.Parameters.AddWithValue("@isBanRong", (br != "1" &&  br != "TRUE") ? 0 : 1);

                    cmd.Parameters.AddWithValue("@DoanhThu", dr["DoanhThu"]);

                    if (allowInsertTruyenThong)
                        cmd.Parameters.AddWithValue("@Truyen_Thong", dr["TThong"]);
                    else
                        cmd.Parameters.AddWithValue("@Truyen_Thong", DBNull.Value);

                    return cmd.ExecuteScalar();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }

            return DBNull.Value;
        }

        private object getTruyenThong(DateTime Ngay, int HopDongID)
        {
            SqlConnection conn = new SqlConnection(BienTc.connString);
            conn.Open();

            SqlCommand cmd = new SqlCommand("SELECT Truyen_Thong FROM DOANHTHU WHERE Ngay = @Ngay and HopDongID = @HopDongID", conn);
            cmd.Parameters.AddWithValue("@Ngay", Ngay.Date);
            cmd.Parameters.AddWithValue("@HopDongID", HopDongID);

            return cmd.ExecuteScalar();
        }

        public void Update(DataRow dr, DateTime Ngay, bool allowInsertTruyenThong, SqlConnection connection = null)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection conn;
                    if (connection == null) conn = new SqlConnection(BienTc.connString);
                    else conn = connection;
                    if (conn.State == ConnectionState.Closed) conn.Open();

                    SqlCommand cmd = new SqlCommand("proc_DT_frmDoanhThu_Update", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@HopDongID", dr["HopDongID"]);
                    cmd.Parameters.AddWithValue("@Ngay", Ngay.Date);

                    if (allowInsertTruyenThong)
                        cmd.Parameters.AddWithValue("@Truyen_Thong", dr["TThong"]);
                    else
                        //cmd.Parameters.AddWithValue("@Truyen_Thong", DBNull.Value);
                        cmd.Parameters.AddWithValue("@Truyen_Thong", getTruyenThong(Ngay, (int)dr["HopDongID"]));

                    cmd.Parameters.AddWithValue("@LoTo234", dr["LoTo234"]);
                    cmd.Parameters.AddWithValue("@CapSo", dr["CapSo"]);
                    cmd.Parameters.AddWithValue("@Boc", dr["Boc"]);
                    cmd.Parameters.AddWithValue("@isBanRong", dr["isBanRong"]);
                    cmd.Parameters.AddWithValue("@DoanhThu", dr["DoanhThu"]);
                    cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }

        /// <summary>
        /// Xóa doanh thu theo DoanhThuID truyền vào
        /// </summary>
        /// <param name="DoanhThuID">ID của doanh thu muốn xóa</param>
        /// <param name="canRestore">true: có thể phục hồi; false: không thể phục hồi</param>
        public void Delete(string DoanhThuID, bool canRestore)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection sqlconn = new SqlConnection(BienTc.connString);
                    sqlconn.Open();
                    SqlCommand cmd;

                    if (canRestore)
                    {
                        cmd = new SqlCommand("UPDATE DOANHTHU SET isPublic = 0 Where ID = '" + DoanhThuID + "' and isPublic=1", sqlconn);
                    }
                    else
                    {
                        cmd = new SqlCommand("DELETE DOANHTHU WHERE ID = '" + DoanhThuID + "' and isPublic = 0", sqlconn);
                    }

                    int i = cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }

        /// <summary>
        /// Xóa doanh thu theo cán bộ và ngày
        /// </summary>
        /// <param name="DMCanBoID">ID của cán bộ có doanh thu muốn xóa</param>
        /// <param name="Ngay">Ngày chứa doanh thu muốn xóa</param>
        /// <param name="canRestore">true: có thể phục hồi; false: không thể phục hồi</param>
        public void DeleteAll(int DMCanBoID, DateTime Ngay, bool canRestore)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection sqlconn = new SqlConnection(BienTc.connString);
                    sqlconn.Open();
                    SqlCommand cmd;
                    string sql = "";

                    if (canRestore)
                    {
                        sql = @"UPDATE DOANHTHU 
                                SET isPublic = 0 
                                FROM HOPDONG HD INNER JOIN DOANHTHU DT ON HD.ID = DT.HopDongID
                                WHERE HD.DMCanBoID = " + DMCanBoID +
                                    " and DT.Ngay = '" + Ngay.ToString("yyyy-MM-dd") + 
                                    "' and DT.isPublic = 1";
                    }
                    else
                    {
                        sql = @"DELETE DOANHTHU 
                                FROM HOPDONG HD INNER JOIN DOANHTHU DT ON HD.ID = DT.HopDongID
                                WHERE HD.DMCanBoID = " + DMCanBoID +
                                    " and DT.Ngay = '" + Ngay.ToString("yyyy-MM-dd") + 
                                    "' and DT.isPublic = 0";
                    }

                    cmd = new SqlCommand(sql, sqlconn);
                    int i = cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }

        /// <summary>
        /// Khôi phục lại doanh thu đã xóa trước đó
        /// </summary>
        /// <param name="DoanhThuID">ID của doanh thu muốn khôi phục</param>
        public void Restore(int DoanhThuID)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection sqlconn = new SqlConnection(BienTc.connString);
                    sqlconn.Open();
                    SqlCommand cmd;

                    cmd = new SqlCommand("UPDATE DOANHTHU SET isPublic = 1 Where ID = '" + DoanhThuID + "' and isPublic=0", sqlconn);
                    int i = cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }

        /// <summary>
        /// Khôi phục lại toàn bộ doanh thu ngày đã xóa trước đó theo cán bộ
        /// </summary>
        /// <param name="DMCanBoID">ID của cán bộ có doanh thu muốn khôi phục</param>
        /// <param name="Ngay">Ngày có doanh thu muốn khôi phục</param>
        public void RestoreAll(int DMCanBoID, DateTime Ngay)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection sqlconn = new SqlConnection(BienTc.connString);
                    sqlconn.Open();
                    SqlCommand cmd;
                    string sql = @"UPDATE DOANHTHU 
                                SET isPublic = 1
                                FROM HOPDONG HD INNER JOIN DOANHTHU DT ON HD.ID = DT.HopDongID
                                WHERE HD.DMCanBoID = " + DMCanBoID +
                                    " and DT.Ngay = '" + Ngay.ToString("yyyy-MM-dd") + 
                                    "' and DT.isPublic = 0";
                    cmd = new SqlCommand(sql, sqlconn);
                    int i = cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }


        /// <summary>
        /// Tính Hoa_Hong (Hoa hồng). Dùng tại frmDoanhThu, frmTHDTHH, rptDTHHTheoDV, clsDTHHDaiLy và clsDTHH.
        /// </summary>
        /// <param name="banrong">Bán rong</param>
        /// <param name="TruyenThong">Truyền thống</param>
        /// <param name="LoTo">Lô tô</param>
        /// <param name="Boc">Bóc</param>
        /// <returns></returns>
        public static decimal HoaHong(object banrong, decimal TruyenThong, decimal LoTo, decimal Boc)
        {
            decimal hoahong = 0;
            bool isBanRong = false;
            if (!string.IsNullOrEmpty(banrong.ToString().Trim())) isBanRong = (bool)banrong || banrong.ToString().Trim()=="1";
            if (isBanRong)
            {
                decimal hh = 0;

                if (TruyenThong < 10000) hh = 12;
                else if (TruyenThong >= 10000 && TruyenThong <= 15000) hh = 12.5M;
                else if (TruyenThong > 15000 && TruyenThong <= 25000) hh = 13M;
                else if (TruyenThong > 25000 && TruyenThong <= 30000) hh = 13.5M;
                else if (TruyenThong > 30000) hh = 14M;

                hoahong = (TruyenThong / 100) * hh + (Boc / 100) * 12 + (LoTo / 100) * 7;
            }
            else
            {
                hoahong = ((TruyenThong + Boc) / 100) * 10 + (LoTo / 100) * 7;
            }

            return hoahong;
        }

        #region ======================================================================
        /// <summary>
        /// Dùng tại rptDTLuuDong_TH
        /// </summary>
        /// <param name="MaDV">Giá trị là '%' hoặc mã đơn vị tương ứng.</param>
        /// <param name="DMCanBoID">Giá trị là -1 (nếu lấy tất cả) hoặc là cán bộ id tương ứng</param>
        /// <param name="TuNgay"></param>
        /// <param name="DenNgay"></param>
        /// <returns></returns>
        public DataTable loadData_rptDTLuuDong_TH(char MaDV, int DMCanBoID, DateTime TuNgay, DateTime DenNgay)
        {
            DataTable dt = new DataTable();

            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                SqlDataAdapter da = new SqlDataAdapter("proc_DT_rptDTLuuDong_TH", conn);
                da.SelectCommand.CommandTimeout = 0;
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.AddWithValue("@TuNgay", TuNgay.Date);
                da.SelectCommand.Parameters.AddWithValue("@DenNgay", DenNgay.Date);
                da.SelectCommand.Parameters.AddWithValue("@MaDV", MaDV);
                da.SelectCommand.Parameters.AddWithValue("@DMCanBoID", DMCanBoID);

                da.Fill(dt);

                #region Thêm cột Tong_DoanhThu, Hoa_Hong, Ty_Le,... và điền giá trị cho chúng -----------
                dt.Columns.Add("Tong_DoanhThu", Type.GetType("System.Decimal"));
                dt.Columns.Add("Ty_Le", Type.GetType("System.Decimal"));
                dt.Columns.Add("Hoa_Hong", Type.GetType("System.Decimal"));
                dt.Columns.Add("LoTo", typeof(int));
                dt.Columns.Add("hhtt", Type.GetType("System.Decimal"));
                dt.Columns.Add("hhboc", Type.GetType("System.Decimal"));
                dt.Columns.Add("HH_LoTo234", Type.GetType("System.Decimal"));
                dt.Columns.Add("HH_CapSo", Type.GetType("System.Decimal"));
                dt.Columns.Add("Hoa_Hong3", Type.GetType("System.Decimal"));
                dt.Columns.Add("tonghhboc", Type.GetType("System.Decimal"));
                dt.Columns.Add("tonghhtt", Type.GetType("System.Decimal"));

                decimal Boc, LoTo234, CapSo, TruyenThong, TongDT;
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    TruyenThong = (decimal)clsCommon.Parse(dt.Rows[i]["Truyen_Thong"].ToString(), 3);
                    Boc = (decimal)clsCommon.Parse(dt.Rows[i]["Boc"].ToString(), 3);
                    LoTo234 = clsCommon.getDecimal(dt.Rows[i]["LoTo234"]);
                    CapSo = clsCommon.getDecimal(dt.Rows[i]["CapSo"]); 
                    TongDT = TruyenThong + Boc + LoTo234 + CapSo;

                    dt.Rows[i]["LoTo"] = LoTo234 + CapSo;
                    dt.Rows[i]["HH_LoTo234"] = (LoTo234 / 100) * 7;
                    dt.Rows[i]["HH_CapSo"] = (CapSo / 100) * 7;

                    bool br = false;
                    string banrong = dt.Rows[i]["isBanRong"].ToString().Trim();
                    if (banrong != "" && banrong.ToUpper() != "FALSE")
                        br = banrong == "True" || System.Convert.ToInt32(banrong) >= 1;

                    if (br)
                    {
                        decimal TyLe = 0;

                        if (TruyenThong < 10000) TyLe = 2;
                        else if (TruyenThong >= 10000 && TruyenThong <= 15000) TyLe = 2.5M;
                        else if (TruyenThong > 15000 && TruyenThong <= 25000) TyLe = 3;
                        else if (TruyenThong > 25000 && TruyenThong <= 30000) TyLe = 3.5M;
                        else if (TruyenThong > 30000) TyLe = 4;
                        
                        dt.Rows[i]["Ty_Le"] = TyLe;
                    }

                    decimal boc2 = br ? (Boc / 100) * 2 : 0;
                    dt.Rows[i]["Hoa_Hong3"] = br ? boc2 : 0;

                    decimal boc10 = (Boc / 100) * 10;
                    dt.Rows[i]["hhboc"] = boc10;
                    dt.Rows[i]["tonghhboc"] = boc10 + boc2;

                    decimal hhtt = (TruyenThong / 100) * 10;
                    dt.Rows[i]["hhtt"] = hhtt;
                    dt.Rows[i]["tonghhtt"] = hhtt + clsCommon.getDecimal(dt.Rows[i]["Hoa_Hong2"]);

                    dt.Rows[i]["Tong_DoanhThu"] = TongDT;
                    dt.Rows[i]["Hoa_Hong"] = hhtt + clsCommon.getDecimal(dt.Rows[i]["Hoa_Hong2"]) + boc10 + boc2;
                }
                #endregion ------------------------------------------------------------------------------
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="MaDV">Giá trị là '%' hoặc mã đơn vị tương ứng.</param>
        /// <param name="DMCanBoID">Giá trị là -1 hoặc cán bộ id tương ứng.</param>
        /// <param name="tuNgay"></param>
        /// <param name="denNgay"></param>
        /// <param name="slblSoHT"></param>
        /// <returns></returns>
        public DataTable loadData_rptDTLuuDong_LT(char MaDV, int DMCanBoID, DateTime tuNgay, DateTime denNgay, ref string slblSoHT)
        {
            DataTable dt = new DataTable("rptTHDTLuuDong");

            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();

                SqlDataAdapter da = new SqlDataAdapter("proc_DT_rptDTLuuDong_LT", conn);
                da.SelectCommand.CommandTimeout = 0;
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.AddWithValue("@TuNgay", tuNgay.Date);
                da.SelectCommand.Parameters.AddWithValue("@DenNgay", denNgay.Date);
                da.SelectCommand.Parameters.AddWithValue("@MaDV", MaDV.ToString());
                da.SelectCommand.Parameters.AddWithValue("@DMCanBoID", DMCanBoID);

                da.Fill(dt);

                #region Thêm cột Tong_DoanhThu, Hoa_Hong, Ty_Le, Hoa_Hong2, Tong_Tien, HT và điền giá trị cho chúng ---------------
                dt.Columns.Add("Tong_DoanhThu", Type.GetType("System.Decimal"));
                dt.Columns.Add("Ty_Le", Type.GetType("System.Decimal"));
                dt.Columns.Add("Hoa_Hong2", Type.GetType("System.Decimal"));
                dt.Columns.Add("Tong_Tien", Type.GetType("System.Decimal"));
                dt.Columns.Add("HT", Type.GetType("System.Decimal"));

                decimal Boc, /*LoTo, */TruyenThong, TongDT, doanhthu, Sum_doanhthu = 0, Sum_TongDT = 0, tien;

                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    TruyenThong = (decimal)clsCommon.Parse(dt.Rows[i]["Truyen_Thong"].ToString(), 3);
                    Boc = (decimal)clsCommon.Parse(dt.Rows[i]["Boc"].ToString(), 3);
                    //LoTo = (decimal)clsCommon.Parse(dt.Rows[i]["LoTo"].ToString(), 3);
                    TongDT = TruyenThong + Boc;// +LoTo;
                    Sum_TongDT += TongDT;

                    dt.Rows[i]["Tong_DoanhThu"] = TongDT;

                    #region Đoạn này tính hoa hồng và tỷ lệ -------------------------------
                    decimal hoaHongPT = 0;
                    if (TruyenThong < 10000) hoaHongPT = 2M;
                    else if (TruyenThong >= 10000 && TruyenThong <= 15000) hoaHongPT = 2.5M;
                    else if (TruyenThong > 15000 && TruyenThong <= 25000) hoaHongPT = 3M;
                    else if (TruyenThong > 25000 && TruyenThong <= 30000) hoaHongPT = 3.5M;
                    else if (TruyenThong > 30000) hoaHongPT = 4M;

                    dt.Rows[i]["Ty_Le"] = hoaHongPT;
                    #endregion------------------------------------------------------------------

                    decimal hoaHong2 = (Boc / 100) * 2;
                    dt.Rows[i]["Hoa_Hong2"] = hoaHong2;
                    dt.Rows[i]["Tong_Tien"] = clsCommon.getDecimal(dt.Rows[i]["Hoa_Hong"]) + hoaHong2;

                    doanhthu = (decimal)clsCommon.Parse(dt.Rows[i]["DoanhThu"].ToString(), 3);
                    Sum_doanhthu += doanhthu;

                    if (doanhthu != 0)
                    {
                        tien = TongDT / doanhthu * 100;
                        dt.Rows[i]["HT"] = Math.Round(tien, 1);
                    }
                }

                decimal tongHT = 0;
                if (Sum_doanhthu == 0)
                {
                    tongHT = 0;
                }
                else
                {
                    tongHT = Sum_TongDT / Sum_doanhthu * 100;
                }
                slblSoHT = (Math.Round(tongHT, 1)).ToString();
                #endregion -------------------------------------------------------------------------------------------------------
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }
        #endregion ===================================================================
        #endregion Methods ===========================================================
    }
}
